~ 本機雲端大不同 ~
今天來介紹自動化證券期貨交易的神兵利器 - 永豐證券 Python API - shioaji
官方網址:https://www.sinotrade.com.tw/ec/20191125/Main/index.aspx
首先要先線上開戶,然後到 憑證申請中心 簽署同意書 & 風險預告書 …etc
簽完後到下圖所示的地方申請 API Key
進去後選新增 API Key,勾選一些選項後送出後會拿到 API Key & Secret Key ,Secret Key 只會出現一次,要好好自己保存起來,然後我們就可以開始寫程式啦
分享一下使用 Apple M1 MacBook 使用永豐 API 的經驗,因為 M1 的 CPU 是 ARM 架構,永豐 API 並沒有提供此平台的 API 可以下載,如果下 pip install shioaji 會提示找不到資源
解法一: 下載 anaconda for x86_64 的版本,用 conda 指令管理 python 版本,設定 python 版本為 x86_64 後建立 virtualenv 或是直接 pip 安裝 shioaji,優點是可以在桌面環境直接開發,缺點是要安裝肥大的 anaconda
解法二:使用 Docker,設定環境變數 export DOCKER_DEFAULT_PLATFORM=linux/amd64 ,讓 Docker 去使用 x86_64 的 Python 開發環境映像檔 ,在裡面 pip install shioaji,優點是只需要有 Docker,缺點是要在 container 裡面開發,速度明顯比較慢
另外需要考慮微服務部署的問題,我們會使用 docker image 的部署方式部署,所以上面的解法二所走的路是一定要走過的也避免不了,那我們就開始走一次解法二吧
$ mkdir marathon-sinotrade && cd marathon-sinotrade
$ code .
總共只需要準備三個檔案:Dockerfile, lambda_function.py, requirements.txt
準備 Dockerfile.dev 內容如下,注意這邊用到的是 shioaji 在 dockerhub 上的 image
FROM sinotrade/shioaji:latest
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python"]
lambda_function.py,我們這裡先放開發測試的程式碼,之後會再加入 handler function
import shioaji as sj
if __name__ == '__main__':
api = sj.Shioaji(simulation=True)
accounts = api.login(<api_key>, <secret_key>)
print(accounts)
requirements.txt 我們還放了 AWS SDK (boto3) ,還有常見的 web 服務框架 flask
boto3
flask
我們到專案目錄下可以下指令:
$ docker build --platform linux/amd64 --no-cache \
-f Dockerfile.dev \
-t marathon-sinotrade:latest .
$ docker images marathon-sinotrade
REPOSITORY TAG IMAGE ID CREATED SIZE
marathon-sinotrade latest 9795047767a3 10 hours ago 872MB
可以執行這個 image:
$ docker run -itd marathon-sinotrade:latest
接著我們到 VSCode 裡面,先安裝 Remote Development 這個套件組合,接著左下角會出現 >< 的符號,點下去:
然後就會有個全新的 VSCode 環境,我們先開啟 /app 這個 folder ,接著安裝 python extension pack:
裝好以後把 lambda_function.py 這個檔案打開,直接按 F5 執行它,應該會出現以下訊息:
... (total connection attempt 1 of 1) | Event: Session up
... person_id=***, broker_id=***, account_id=***, username=***), ...
這樣一來我們就可以在 M1 Macbook 下開發 shioaji api 相關的程式囉!
筆者同時也嘗試了 vscode devcontainer 的 extension 發現一樣對 arm64 的 cpu 支援度不足
當然用上述方式在 container 裡面寫的程式碼也要同步出來才行,理想的使用方式應該是使用資料卷(Volumes)
明天會說明如何部署到 AWS Lambda 上去
https://www.kenmuse.com/blog/forcing-dev-container-to-use-amd64/
https://sinotrade.github.io/
https://code.visualstudio.com/docs/devcontainers/create-dev-container